-- dailyTask.lua - 日程安排脚本模块
-- 功能说明：这是"日程安排"功能的实现脚本，不是每日任务！
-- 主要功能：根据中控端设置的日程安排自动执行指定地区的挂机任务
-- 命名约定：dailyTask = 日程安排, dailyMission = 每日任务
-- 可以被其他脚本调用
--[[
日程安排执行流程：
1：回到主界面
2：点击菜单（点击之前判断一下是否是主界面）
3：点击重置日程点击保存  确认
4：点击日程设置点击"金币恢复" 点击"一键购买设置"  点击"键盘"  点击数字区域 点击1000 点击 确认  点击确认 点击使用 关闭
]]

local config = require('Config/config')  -- 加载配置文件
local config_loader = require('Config/config_loader')  -- 加载配置加载器
local M = {}
local NIGHT_CROWS_PACKAGE = "com.wemade.nightcrowsglobal"
local TURING = require("TURING")
local Tools = require('Tools')
local text_recognition_lib = require('Config/TextRecognition2').文字识别库_日程安排
local text_recognition_lib_level = require('Config/TextRecognition2').文字识别库_日程安排_等级数字库

-- 全局配置变量
local game_config = nil

-- 初始化配置
local function init_daily_task_config()
    print("[DEBUG] 初始化日程任务配置...")
    
    -- 从手机端配置文件加载
    local daily_task_config = config_loader.load_daily_task_config()
    if daily_task_config then
        print("[DEBUG] 成功从手机端加载日程任务配置")
        print("[DEBUG] 配置数据类型: " .. type(daily_task_config))
        print("[DEBUG] 配置数据内容:")
        -- 详细打印配置内容
        if type(daily_task_config) == "table" then
            print("[DEBUG] ========== 完整配置内容开始 ==========")
            -- 递归打印配置内容
            local function print_table(t, indent)
                indent = indent or ""
                for key, value in pairs(t) do
                    if type(value) == "table" then
                        print(indent .. tostring(key) .. " = {")
                        print_table(value, indent .. "  ")
                        print(indent .. "}")
                    else
                        print(indent .. tostring(key) .. " = " .. tostring(value))
                    end
                end
            end
            
            print_table(daily_task_config)
            print("[DEBUG] ========== 完整配置内容结束 ==========")
        else
            print("  配置内容: " .. tostring(daily_task_config))
        end
        
        -- 验证配置结构并转换为内部格式
        if daily_task_config.dungeons and daily_task_config.regions then
            print("[DEBUG] 配置结构验证成功：包含dungeons和regions")
            
            -- 转换为内部使用的格式，并重构为包含count的格式
            game_config = {
                ["副本"] = {},
                ["区域"] = {}
            }
            
            -- 重构副本配置，合并重复等级
            if daily_task_config.dungeons then
                for _, dungeon in ipairs(daily_task_config.dungeons) do
                    local newDungeon = {
                        name = dungeon.name,
                        areas = {}
                    }
                    
                    -- 统计每个等级的数量
                    local levelCounts = {}
                    for _, area in ipairs(dungeon.areas) do
                        if area.level then
                            levelCounts[area.level] = (levelCounts[area.level] or 0) + 1
                        end
                    end
                    
                    -- 转换为count格式
                    for level, count in pairs(levelCounts) do
                        table.insert(newDungeon.areas, {
                            level = level,
                            count = count
                        })
                    end
                    
                    table.insert(game_config["副本"], newDungeon)
                end
            end
            
            -- 重构区域配置，合并重复等级
            if daily_task_config.regions then
                for _, region in ipairs(daily_task_config.regions) do
                    local newRegion = {
                        name = region.name,
                        areas = {}
                    }
                    
                    -- 统计每个等级的数量
                    local levelCounts = {}
                    for _, area in ipairs(region.areas) do
                        if area.level then
                            levelCounts[area.level] = (levelCounts[area.level] or 0) + 1
                        end
                    end
                    
                    -- 转换为count格式
                    for level, count in pairs(levelCounts) do
                        table.insert(newRegion.areas, {
                            level = level,
                            count = count
                        })
                    end
                    
                    table.insert(game_config["区域"], newRegion)
                end
            end
            
            print("[DEBUG] 配置重构完成（合并重复等级为count格式）")
            print("[DEBUG] 副本数量: " .. #game_config["副本"])
            print("[DEBUG] 区域数量: " .. #game_config["区域"])
            
            -- 显示重构后的配置详情
            print("[DEBUG] ========== 重构后配置详情 ==========")
            for i, region in ipairs(game_config["区域"]) do
                if region.name and region.areas then
                    print("[DEBUG]   区域" .. i .. ": " .. region.name .. " (子区域数量: " .. #region.areas .. ")")
                    for j, area in ipairs(region.areas) do
                        print("[DEBUG]     子区域" .. j .. ": " .. area.level .. " (数量: " .. area.count .. ")")
                    end
                end
            end
            
            for i, dungeon in ipairs(game_config["副本"]) do
                if dungeon.name and dungeon.areas then
                    print("[DEBUG]   副本" .. i .. ": " .. dungeon.name .. " (子区域数量: " .. #dungeon.areas .. ")")
                    for j, area in ipairs(dungeon.areas) do
                        print("[DEBUG]     子区域" .. j .. ": " .. area.level .. " (数量: " .. area.count .. ")")
                    end
                end
            end
            print("[DEBUG] ========== 重构后配置详情结束 ==========")
        else
            print("[ERROR] 配置结构验证失败：缺少dungeons或regions字段")
            print("[DEBUG] 可用字段:")
            for key, value in pairs(daily_task_config) do
                print("  " .. tostring(key) .. ": " .. tostring(value))
            end
            return false
        end
        
        print("[DEBUG] 日程任务配置初始化成功")
        return true
    else
        print("[DEBUG] 手机端配置文件不存在")
        print("[WARNING] 日程任务配置初始化失败，将使用默认配置")
        game_config = nil
        return false
    end
end

-- 通用方法：基于标题文字查找并点击设置选项
-- 参数：
--   title_text: 设置标题文字
--   x_offset: x方向偏移量（相对于标题的x坐标）
--   y_offset: y方向偏移量（相对于标题的y坐标）
local function click_setting_option(title_text, x_offset, y_offset)
    print("查找设置标题: " .. title_text)
    -- 首先查找标题，获取其坐标
    local title_x, title_y = Tools.scroll_find_text(
        title_text,  -- 目标文字
        {x1 = 139, y1 = 143, x2 = 1136, y2 = 621},  -- 滚动区域（模拟参数，需要替换为真实参数）
        "0-102",  -- 滤镜参数（模拟参数）
        {x = 1, y = 6, width = "60-200", height = "17-18"},  -- 切割参数（模拟参数）1,6,"60-200","17-18"
        text_recognition_lib
    )
    
    if title_x and title_y then
        print("找到标题'" .. title_text .. "'，坐标 (" .. title_x .. "," .. title_y .. ")")
        -- 计算按钮的坐标
        local button_x = title_x + x_offset
        local button_y = title_y + y_offset
        
        print("点击按钮，坐标 (" .. button_x .. "," .. button_y .. ")")
        tap(button_x, button_y)
        sleep(config.SLEEP_TIME)
        return true
    else
        print("未找到标题'" .. title_text .. "'")
        return false
    end
end

--一键购买设置点击通用方法
local function click_setting_OneKeyBuy(title_text,number)
    print("查找设置标题: " .. title_text)
    -- 首先查找标题，获取其坐标
    local title_x, title_y = Tools.scroll_find_text(
        title_text,  -- 目标文字
        {x1 = 427, y1 = 163, x2 = 850, y2 = 537},  -- 滚动区域（模拟参数，需要替换为真实参数）27,163,850,537
        "0-81",  -- 滤镜参数（模拟参数）
        {x = 1, y = 6, width = "30-109", height = "15-16"},  -- 切割参数（模拟参数）1,6,"60-200","17-18"
        text_recognition_lib
    )
    
    if title_x and title_y then
        print("找到标题'" .. title_text .. "'，坐标 (" .. title_x .. "," .. title_y .. ")")
        -- 计算按钮的坐标
        local button_x = title_x + (338-101)
        local button_y = title_y + (59-17)
        
        print("点击按钮，坐标 (" .. button_x .. "," .. button_y .. ")")
        tap(button_x, button_y)
        sleep(config.SLEEP_TIME)
        Tools.InputNumber(number)
        return true
    else
        print("未找到标题'" .. title_text .. "'")
        return false
    end
end

--点击菜单按钮 检测并点击日程按钮
local function ClickDailyTaskBtn(expect_result)
    print("1-菜单日程安排入口按钮-点击菜单按钮")
    tap(1239,38)
    sleep(config.SLEEP_TIME)   

    print("1-菜单日程安排入口按钮-检测并点击日程按钮")
    local flag=Tools.turing_recognize_and_act(981,249,1271,530, "0-84", 1,6, text_recognition_lib, expect_result, 
    function(x,y)
        tap(x,y)
        sleep(config.SLEEP_TIME) 
    end, "40-60","11-13")
    return flag
end

--保存日程
local function SaveDailyTask()
    local flag=Tools.turing_recognize_and_act(929,155,972,181, "0-123", 1, 6, text_recognition_lib, "保存", function(x,y) tap(x,y)sleep(config.SLEEP_TIME) end)
    if flag then
        Tools.turing_recognize_and_act(462,225,773,484, "0-114", 1, 6, text_recognition_lib, "是否保存当前添加的日程", function(x,y)tap(730,451)sleep(config.SLEEP_TIME) end,"200-300","16-30")
    end
end

--检测并点击重置日程按钮 
local function ClickResetBtn(expect_result)
    print("2-主界面-重置日程-检测并点击重置日程按钮")
    local flag=Tools.turing_recognize_and_act(566,650,685,698, "0-115", 1, 6, text_recognition_lib, expect_result, function(x,y)tap(x,y)sleep(config.SLEEP_TIME) end)

    if flag then
        SaveDailyTask()
    end
    return flag
end

local function InputNumberConfirm()
    --检测是否是购买设置界面
    print("检测是否是购买设置界面")
    local flag=Tools.turing_recognize_and_act(569,112,714,144, "0-115", 1, 6, text_recognition_lib, "一键购买设置", 
    function(x,y)
    end)
    if flag then
        print("生命力药水")
        click_setting_OneKeyBuy("生命力药水",999)
        click_setting_OneKeyBuy("高级生命力药水",0)
        click_setting_OneKeyBuy("突击灵药",200)
        click_setting_OneKeyBuy("必胜灵药",300)
        click_setting_OneKeyBuy("瞬间移动卷轴",10)
        click_setting_OneKeyBuy("据点传送卷轴",10)
        click_setting_OneKeyBuy("魔石",0)
        Tools.turing_recognize_and_act(569,112,714,144, "0-115", 1, 6, text_recognition_lib, "一键购买设置", 
        function(x,y)
            tap(642,579)--确定
            sleep(config.SLEEP_TIME) 
        end)
        return true
    else
        print("不是购买设置界面")
        return false
    end
end

--检测按钮名称并点击一键购买设置   
local function ClickOneKeyBuySetting()
    print("3-日程设置")
    print("日程设置-检测并点击日程设置按钮")
    Tools.turing_recognize_and_act(0,0,1280,720, "0-126", 1, 6, text_recognition_lib, "日程设置",
    function(x,y)
        tap(x,y)
        sleep(config.SLEEP_TIME) 
    end,"60-76","18-18")

    sleep(config.SLEEP_TIME) 

    click_setting_option("恢复死亡惩罚设置", 754-178,0 )  -- 标题文字, x偏移, y偏移
    click_setting_option("返回据点与自动购买", 897-178,0 )  -- 标题文字, x偏移, y偏移
    click_setting_option("预约日程安排", 897-178,0 )  -- 标题文字, x偏移, y偏移
    click_setting_option("自动狩猎文明模式", 621-178,0 )  -- 标题文字, x偏移, y偏移
    click_setting_option("自动狩猎探查范围", 1038-178,0 )  -- 标题文字, x偏移, y偏移

    print("检测并点击一键购买设置")
    local title_x, title_y = Tools.scroll_find_text(
        "一键购买设置",  -- 目标文字
        {x1 = 139, y1 = 143, x2 = 1136, y2 = 621},  -- 滚动区域（模拟参数，需要替换为真实参数）
        "0-102",  -- 滤镜参数（模拟参数）
        {x = 1, y = 6, width = "60-200", height = "17-18"},  -- 切割参数（模拟参数）1,6,"60-200","17-18"
        text_recognition_lib
    )
    if title_x and title_y then
        tap(title_x, title_y)
        sleep(config.SLEEP_TIME)
    else
        print("未找到一键购买设置")
        return false
    end

    --输入购买数量和类型
    InputNumberConfirm()

    print("关闭日程参数设置界面")
    Tools.turing_recognize_and_act(567,82,666,113, "0-126", 1, 6, text_recognition_lib, "日程设置-返回",
    function(x,y)
        print("点击关闭日程参数设置界面")
        tap(1138,104)
        sleep(config.SLEEP_TIME) 
    end)
    return true
end

-- 滑动选择并点击大区的方法
-- 参数：
--   category_type: 类别类型（"区域" 或 "副本"）
--   region_name: 大区名称
local function swipe_select_region(category_type, region_name)
    print("开始滑动选择" .. category_type .. ": " .. region_name)
    
    -- 滑动区域参数
    local scroll_area = {x1 = 22, y1 = 142, x2 = 319, y2 = 607}--22,142,319,607
    local filter_params = "0-143"
    local cut_params = {x = 1, y = 6, width = "30-150", height = "18-20"}--1,6,"30-150","18-20"
    
    -- 使用滑动查找方法查找并点击大区
    local x, y = Tools.scroll_find_text(
        region_name,  -- 目标文字
        scroll_area,  -- 滚动区域
        filter_params, -- 滤镜参数
        cut_params,   -- 切割参数
        text_recognition_lib
    )
    
    if x and y then
        print("找到" .. category_type .. ": " .. region_name .. "，坐标 (" .. x .. "," .. y .. ")")
        tap(x, y)
        sleep(config.SLEEP_TIME)
        return true
    else
        print("未找到" .. category_type .. ": " .. region_name)
        return false
    end
end

-- 滑动选择并点击具体区域的方法
-- 参数：
--   area_name: 具体区域名称
local function swipe_select_area(area_name)
    print("开始滑动选择具体区域: " .. area_name)
    
    -- 滑动区域参数
    local scroll_area = {x1 = 349, y1 = 145, x2 = 706, y2 = 648} --349,145,706,648
    local cut_params = {x = 1, y = 6, width = "30-150", height = "15-20"} --1,6, "30-150", "16-20" 高改小看是否能识别
    
    -- 定义两种filter_params参数
    local filter_params_list = {"0-114", "0-46"}
    
    -- 使用新的多滤镜参数方法查找并双击具体区域
    local x, y = Tools.scroll_find_text_multi_filter(
        area_name,    -- 目标文字
        scroll_area,  -- 滚动区域
        filter_params_list, -- 滤镜参数列表
        cut_params,   -- 切割参数
        text_recognition_lib
    )
    
    if x and y then
        print("找到具体区域: " .. area_name .. "，坐标 (" .. x .. "," .. y .. ")，执行双击")
        -- 执行双击操作
        tap(x, y)
        sleep(100)
        tap(x, y)
        sleep(config.SLEEP_TIME)
        return true
    else
        print("所有filter_params参数都未找到具体区域: " .. area_name)
        return false
    end
end

-- 新增：使用等级文字识别选择具体区域（类似每日任务脚本的逻辑）
local function FindAndClickSpecificArea(areaConfig)
    local areaName = areaConfig.level or areaConfig.name
    local areaCount = areaConfig.count or 1
    
    print("在中间区域滑动查找具体区域 " .. areaName .. "，需要找到 " .. areaCount .. " 个")
    
    -- 中间任务列表区域的坐标（根据界面调整）
    local centerArea = {
        x1 = 349, y1 = 145,  -- 左上角（来自日程安排界面的坐标）
        x2 = 706, y2 = 648   -- 右下角（来自日程安排界面的坐标）
    }
    
    -- 使用新的count方法查找指定数量的文字
    local results = Tools.scroll_find_text_count(
        areaName,                -- 目标文字：等级文字（如"30级"）
        centerArea,              -- 滚动区域坐标
        "0-104",                -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
        {x = 1, y = 4, width = "17-60", height = "13-16"},  -- 切割参数（来自TURING.切割_范围投影切割）
        text_recognition_lib_level,  -- 等级数字字库函数
        areaCount               -- 需要找到的数量
    )
    
    if #results >= areaCount then
        print("成功找到 " .. #results .. " 个目标: " .. areaName)
        
        -- 遍历所有找到的坐标进行点击
        for i, coord in ipairs(results) do
            print("点击第 " .. i .. " 个目标: " .. areaName .. "，坐标 (" .. coord.x .. "," .. coord.y .. ")")
            
            -- 执行双击操作
            tap(coord.x, coord.y)
            sleep(100)
            tap(coord.x, coord.y)
            sleep(config.SLEEP_TIME)
        end
        
        return true
    else
        print("未找到足够的文字: " .. areaName .. "，只找到 " .. #results .. " 个，需要 " .. areaCount .. " 个")
        return false
    end
end

-- 处理区域选择
local function process_regions()
    print("开始处理区域选择")
    
    -- 点击"区域"按钮
    local flag = Tools.turing_recognize_and_act(73,81,137,116, "0-61", 1, 6, text_recognition_lib, "区域", 
        function(x,y)
            tap(x,y) 
            sleep(config.SLEEP_TIME) 
        end
    )
    if flag then
        print("选择区域成功")
    else
        print("当前本来就在该区域")
    end
    
    -- 检查配置结构
    if not game_config or not game_config["区域"] then
        print("[ERROR] 配置结构错误：game_config或game_config['区域']为nil")
        print("[DEBUG] game_config类型: " .. type(game_config))
        if game_config then
            print("[DEBUG] game_config内容:")
            for key, value in pairs(game_config) do
                print("  " .. tostring(key) .. ": " .. tostring(value))
            end
        end
        return false
    end
    
    -- 遍历所有区域
    for _, region in ipairs(game_config["区域"]) do
        if #region.areas > 0 then  -- 只处理有具体区域的区域
            print("处理区域: " .. region.name)
            
            -- 滑动选择大区
            if swipe_select_region("区域", region.name) then
                -- 遍历该区域下的所有具体区域
                for _, area in ipairs(region.areas) do
                    if area.level then
                        local areaCount = area.count or 1
                        print("处理具体区域: " .. area.level .. "，数量: " .. areaCount)
                        
                        -- 根据等级和数量查找并选择具体区域
                        if FindAndClickSpecificArea(area) then
                            print("成功选择具体区域: " .. area.level .. "，数量: " .. areaCount)
                        else
                            print("选择具体区域失败: " .. area.level .. "，数量: " .. areaCount)
                            return false
                        end
                    else
                        print("处理具体区域: " .. area.name)
                        
                        -- 滑动选择具体区域（兼容旧格式）
                        if swipe_select_area(area.name) then
                          
                        else
                            print("选择具体区域失败")
                            return false
                        end
                    end
                    
                    -- 区域间稍作等待
                    sleep(500)
                end
            end
        end
    end
    return true
end

-- 处理副本选择
local function process_instances()
    print("开始处理副本选择")
    
    -- 点击"副本"按钮
    local flag = Tools.turing_recognize_and_act(255,85,307,114, "0-61", 1, 6, text_recognition_lib, "副本", 
        function(x,y)
            tap(x,y) 
            sleep(config.SLEEP_TIME) 
        end
    )
    if flag then
        print("选择副本成功")
    else
        print("当前本来就在该副本")
    end
    
    -- 检查配置结构
    if not game_config or not game_config["副本"] then
        print("[ERROR] 配置结构错误：game_config或game_config['副本']为nil")
        print("[DEBUG] game_config类型: " .. type(game_config))
        if game_config then
            print("[DEBUG] game_config内容:")
            for key, value in pairs(game_config) do
                print("  " .. tostring(key) .. ": " .. tostring(value))
            end
        end
        return false
    end
    
    -- 遍历所有副本
    for _, instance in ipairs(game_config["副本"]) do
        if #instance.areas > 0 then  -- 只处理有具体区域的副本
            print("处理副本: " .. instance.name)
            
            -- 滑动选择大区
            if swipe_select_region("副本", instance.name) then
                -- 遍历该副本下的所有具体区域
                for _, area in ipairs(instance.areas) do
                    if area.level then
                        local areaCount = area.count or 1
                        print("处理具体区域: " .. area.level .. "，数量: " .. areaCount)
                        
                        -- 根据等级和数量查找并选择具体区域
                        if FindAndClickSpecificArea(area) then
                            print("成功选择具体区域: " .. area.level .. "，数量: " .. areaCount)
                        else
                            print("选择具体区域失败: " .. area.level .. "，数量: " .. areaCount)
                            return false
                        end
                    else
                        print("处理具体区域: " .. area.name)
                        
                        -- 滑动选择具体区域（兼容旧格式）
                        if swipe_select_area(area.name) then
                           
                        else
                            print("选择具体副本失败")
                            return false
                        end
                    end
                    
                    -- 区域间稍作等待
                    sleep(500)
                end
            end
        end
    end
    return true
end

--选择区域和副本
local function ChooseErea()
    print("开始选择区域和副本")
    
    -- 如果配置未初始化，先初始化
    if not game_config then
        if not init_daily_task_config() then
            print("配置初始化失败，无法继续")
            return false
        end
    end
    
    print("配置文件加载成功")
    
    -- 处理区域选择
    if process_regions() then
       
    else
        print("区域选择失败")
        return false
    end
    
    -- 处理副本选择
    if process_instances() then
       
    else
        print("副本选择失败")
        return false
    end
    
    SaveDailyTask()

    print("区域和副本选择完成")
    return true
end

local function StartDailyTask()
    print("开始日程")
    return Tools.turing_recognize_and_act(1086,665,1247,700, "0-137", 1, 6, text_recognition_lib, "开始日程", 
    function(x,y)
        tap(x,y)
        sleep(config.SLEEP_TIME) 
    end)
end

-- 点击结束日程按钮
local function ClickEndDailyTask()
    print("点击结束日程")
    return Tools.click_button("结束日程", "结束日程", "1",
        1121, 661, 1210, 696,  -- 按钮区域坐标（来自TURING.滤镜_通用_延伸裁剪）
        "0-126",               -- 滤镜参数（来自TURING.滤镜_彩色_二值化）
        1, 6,                  -- 切割参数（来自TURING.切割_范围投影切割）
        text_recognition_lib   -- 字库函数
    )
end


--返回主界面
function M.ReturnMain()
    Tools.turing_recognize_and_act(569,112,714,144, "0-115", 1, 6, text_recognition_lib, "一键购买设置", 
    function(x,y)
        print("关闭一键购买设置界面")
        tap(642,579)--确定
        sleep(config.SLEEP_TIME) 
    end)
    Tools.turing_recognize_and_act(567,82,666,113, "0-126", 1, 6, text_recognition_lib, "日程设置",
    function(x,y)
        print("点击关闭日程参数设置界面")
        tap(1138,101)
        sleep(config.SLEEP_TIME) 
    end)
    Tools.turing_recognize_and_act(28,13,174,54, "0-115", 2, 20, text_recognition_lib, "日程安排-返回", 
    function(x,y)
        print("点击关闭日程设置界面")
        tap(36,33)
        sleep(config.SLEEP_TIME) 
    end,"20-150","16-30")
    Tools.turing_recognize_and_act(417,222,861,496, "0-104", 12, 10, text_recognition_lib, "不保存日程安排继续退出吗", 
    function(x,y)
        print("点击确认不保存日程关闭")
        tap(731,449)
        sleep(config.SLEEP_TIME) 
    end,"350-400","70-80")
end

function M.Test()
    ChooseErea()
end

--运行日常任务
function M.RunDailyTask()
    print("运行日常任务")
   if init_daily_task_config() then
        print("配置初始化成功")
   else
        print("配置初始化失败")
        return false
   end
    if ClickDailyTaskBtn("日程安排") then
        ClickEndDailyTask()--结束现有日程
        if  ClickResetBtn("重置日程") then
            if ClickOneKeyBuySetting() then--日程设置
               if ChooseErea() then--选择区域和副本
                    if  StartDailyTask() then--开始日程
                        M.ReturnMain()--返回主界面
                    else
                        print("开始日程失败")
                        return false
                    end
               else
                    print("选择区域和副本失败")
                    return false
               end
            else
                print("点击重置日程失败")
                return false
            end
        else
            print("点击重置日程失败")
            return false
        end
    else    
        print("点击日程安排失败")
        return false
    end
   
end



return M

